/**
 * 给定长度为N的字符串，表示小B出的石头剪刀布的序列
 * 现在需要决定小A的出法序列，满足：
 * 1. 每一把都不能输
 * 2. 不能连续两次出相同的
 * 问最多能赢多少
 * 
 * 令Dij是第i把出j所能赢得的数量，则答案是max(D[N])
 * 令 j+1 总是赢 j
 * 令 now 是当前这一轮小B出的，则
 * D[i][now] = max(D[i - 1][now - 1], D[i - 1][now + 1])
 * D[i][now + 1] = 1 + max(D[i - 1][now], D[i - 1][now + 2])
 * D[i][now - 1] = -1
 * 
 * 题解专门交代了贪心显然是不行的。
 * 例如: 002
 * 贪心的话，第一把就出1，第二把只能出0，第三把只能出2
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using Real = long double;

int N;
string S;
vi A;
vector<array<int, 3>> D;
/// R P S

llt chkadd(llt a, llt b){
    if(-1 == a or -1 == b) return -1;
    return a + b;
}

void work(){ 
    cin >> N >> S;
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        if('R' == S[i - 1]){
            A[i] = 2;
        }else if('P' == S[i - 1]){
            A[i] = 0;
        }else if('S' == S[i - 1]){
            A[i] = 1;
        }else{
            assert(0);
        }        
    }

    D.assign(N + 1, {0, 0, 0});
    for(int i=1;i<=N;++i){
        int now = A[i];

        D[i][now] = max(D[i - 1][(now + 1) % 3], D[i - 1][(now + 2) % 3]);
        D[i][(now + 1) % 3] = 1 + max(D[i - 1][now], D[i - 1][(now + 2) % 3]); 
        D[i][(now + 2) % 3] = -1;

#ifndef ONLINE_JUDGE
        cout << i << ":";
        for(auto j : D[i]) cout << " " << j;
        cout << endl;
#endif
    }
    cout << *max_element(D[N].begin(), D[N].end()) << endl;
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}